#region Usings

using System;
using System.IO;
using Castle.ActiveRecord;
using NUnit.Framework;
using Karma.Framework.Core.Domain.Tools.Import.Data;
using Karma.Framework.Core.Domain.Tools.Import.Layout;
using Karma.Framework.Core.Domain.Tools.Import.Validation;
using Karma.Framework.Core.Test.Domain.Tools.Importador.Entidades;
using Karma.Framework.Core.UnitTest;

#endregion

namespace Karma.Framework.Core.Test.Domain.Tools.Importador
{
    [TestFixture]
    public class ValidadorReferenciasFixture : AbstractTestCase
    {
        [Ignore]
        [Test]
        public void ValidaEntidadConAgregadoErrorTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociadosYAgregados>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            var entityBuilder = new DefaultEntityBuilder<EntidadConAsociadosYAgregados>();
            var entities = entityBuilder.BuildEntities(data);

            var validator = new DefaultReferenceValidator();
            var summary = validator.Validate(layout, entities);

            Assert.IsNotNull(summary);
            Assert.IsTrue(summary.HasErrors);
            Assert.AreEqual(2, summary.ErrorSummary.Errors.Count);
        }

        [Ignore]
        [Test]
        public void ValidaEntidadConAgregadoTest()
        {
            ActiveRecordMediator<EntidadSimple>.Save(new EntidadSimple
                                                         {
                                                             Cadena = "aaaa",
                                                             Entero = 1,
                                                             Fecha = DateTime.Now
                                                         });
            ActiveRecordMediator<EntidadSimple>.Save(new EntidadSimple
                                                         {
                                                             Cadena = "bbbb",
                                                             Entero = 2,
                                                             Fecha = DateTime.Now
                                                         });
            FlushAndRecreateScope();

            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociadosYAgregados>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            var entityBuilder = new DefaultEntityBuilder<EntidadConAsociadosYAgregados>();
            var entities = entityBuilder.BuildEntities(data);

            var validator = new DefaultReferenceValidator();
            var summary = validator.Validate(layout, entities);

            Assert.IsNotNull(summary);
            Assert.IsFalse(summary.HasErrors);
        }

        [Test]
        public void ValidaEntidadConAsciadoErrorTest()
        {
            ActiveRecordMediator<EntidadSimple>.Save(new EntidadSimple
                                                         {
                                                             Cadena = "aaaa",
                                                             Entero = 1,
                                                             Fecha = DateTime.Now
                                                         });
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociados>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            var entityBuilder = new DefaultEntityBuilder<EntidadConAsociados>();
            var entities = entityBuilder.BuildEntities(data);

            var validator = new DefaultReferenceValidator();
            var summary = validator.Validate(layout, entities);

            Assert.IsNotNull(summary);
            Assert.IsTrue(summary.HasErrors);
            Assert.AreEqual(4800, summary.ErrorSummary.Errors.Count);
        }

        [Test]
        public void ValidaEntidadConAsciadoTest()
        {
            ActiveRecordMediator<EntidadSimple>.Save(new EntidadSimple
                                                         {
                                                             Cadena = "aaaa",
                                                             Entero = 1,
                                                             Fecha = DateTime.Now
                                                         });
            ActiveRecordMediator<EntidadSimple>.Save(new EntidadSimple
                                                         {
                                                             Cadena = "bbbb",
                                                             Entero = 2,
                                                             Fecha = DateTime.Now
                                                         });
            FlushAndRecreateScope();

            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociados>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            var entityBuilder = new DefaultEntityBuilder<EntidadConAsociados>();
            var entities = entityBuilder.BuildEntities(data);

            var validator = new DefaultReferenceValidator();
            var summary = validator.Validate(layout, entities);

            Assert.IsNotNull(summary);
            Assert.IsFalse(summary.HasErrors);
        }

        [Test]
        public void ValidaEntidadConAsociadosConIdRefErrorTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociadosConIdRef>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            var entityBuilder = new DefaultEntityBuilder<EntidadConAsociadosConIdRef>();
            var entities = entityBuilder.BuildEntities(data);

            var validator = new DefaultReferenceValidator();
            var summary = validator.Validate(layout, entities);

            Assert.IsNotNull(summary);
            Assert.IsTrue(summary.HasErrors);
            Assert.AreEqual(10639, summary.ErrorSummary.Errors.Count);
        }

        [Test]
        public void ValidaEntidadConAsociadosConIdRefTest()
        {
            ActiveRecordMediator<EntidadSimple>.Save(new EntidadSimple
                                                         {
                                                             Cadena = "aaaa",
                                                             Entero = 1,
                                                             Fecha = DateTime.Now
                                                         });
            ActiveRecordMediator<EntidadSimple>.Save(new EntidadSimple
                                                         {
                                                             Cadena = "bbbb",
                                                             Entero = 2,
                                                             Fecha = DateTime.Now
                                                         });
            FlushAndRecreateScope();

            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociadosConIdRef>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            var entityBuilder = new DefaultEntityBuilder<EntidadConAsociadosConIdRef>();
            var entities = entityBuilder.BuildEntities(data);

            var validator = new DefaultReferenceValidator();
            var summary = validator.Validate(layout, entities);

            Assert.IsNotNull(summary);
            Assert.IsFalse(summary.HasErrors);
        }

        [Test]
        public void ValidaEntidadSimpleConIdTest()
        {
            ActiveRecordMediator<EntidadSimple>.Save(new EntidadSimple
                                                         {
                                                             Cadena = "aaaa",
                                                             Entero = 1,
                                                             Fecha = DateTime.Now
                                                         });

            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            var entityBuilder = new DefaultEntityBuilder<EntidadSimple>();
            var entities = entityBuilder.BuildEntities(data);

            var validator = new DefaultReferenceValidator();
            var summary = validator.Validate(layout, entities);

            Assert.IsNotNull(summary);
            Assert.IsFalse(summary.HasErrors);
        }

        [Test]
        public void ValidaEntidadSimpleErrorIdTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            var entityBuilder = new DefaultEntityBuilder<EntidadSimple>();
            var entities = entityBuilder.BuildEntities(data);

            var validator = new DefaultReferenceValidator();
            var summary = validator.Validate(layout, entities);

            Assert.IsNotNull(summary);
            Assert.IsTrue(summary.HasErrors);
            Assert.AreEqual(1, summary.ErrorSummary.Errors.Count);
        }

        [Test]
        public void ValidaEntidadSimpleTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            var entityBuilder = new DefaultEntityBuilder<EntidadSimple>();
            var entities = entityBuilder.BuildEntities(data);

            var validator = new DefaultReferenceValidator();
            var summary = validator.Validate(layout, entities);

            Assert.IsNotNull(summary);
            Assert.IsFalse(summary.HasErrors);
        }
    }
}